home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / lib / udev / write_net_rules < prev   
Text File  |  2008-10-24  |  3KB  |  123 lines

  1. #!/bin/sh -e
  2. #
  3. # Copyright (C) 2006 Marco d'Itri <md@Linux.IT>
  4. # Copyright (C) 2007 Kay Sievers <kay.sievers@vrfy.org>
  5. #
  6. # This program is free software; you can redistribute it and/or modify it
  7. # under the terms of the GNU General Public License as published by the
  8. # Free Software Foundation version 2 of the License.
  9. #
  10. # This script is run to create persistent network device naming rules
  11. # based on properties of the device.
  12. # If the interface needs to be renamed, INTERFACE_NEW=<name> will be printed
  13. # on stdout to allow udev to IMPORT it.
  14.  
  15. # variables used to communicate:
  16. #   MATCHADDR             MAC address used for the match
  17. #   MATCHID               bus_id used for the match
  18. #   MATCHDEVID            dev_id used for the match
  19. #   MATCHDRV              driver name used for the match
  20. #   MATCHIFTYPE           interface type match
  21. #   COMMENT               comment to add to the generated rule
  22. #   INTERFACE_NAME        requested name supplied by external tool
  23. #   INTERFACE_NEW         new interface name returned by rule writer
  24.  
  25. RULES_FILE='/etc/udev/rules.d/70-persistent-net.rules'
  26.  
  27. . /lib/udev/rule_generator.functions
  28.  
  29. interface_name_taken() {
  30.     local value="$(find_all_rules 'NAME=' $INTERFACE)"
  31.     if [ "$value" ]; then
  32.         return 0
  33.     else
  34.         return 1
  35.     fi
  36. }
  37.  
  38. find_next_available() {
  39.     raw_find_next_available "$(find_all_rules 'NAME=' "$1")"
  40. }
  41.  
  42. write_rule() {
  43.     local match="$1"
  44.     local name="$2"
  45.     local comment="$3"
  46.  
  47.     {
  48.     if [ "$PRINT_HEADER" ]; then
  49.         PRINT_HEADER=
  50.         echo "# This file was automatically generated by the $0"
  51.         echo "# program run by the persistent-net-generator.rules rules file."
  52.         echo "#"
  53.         echo "# You can modify it, as long as you keep each rule on a single line."
  54.     fi
  55.  
  56.     echo ""
  57.     [ "$comment" ] && echo "# $comment"
  58.     echo "SUBSYSTEM==\"net\", ACTION==\"add\"$match, NAME=\"$name\""
  59.     } >> $RULES_FILE
  60. }
  61.  
  62. if [ -z "$INTERFACE" ]; then
  63.     echo "missing \$INTERFACE" >&2
  64.     exit 1
  65. fi
  66.  
  67. # Prevent concurrent processes from modifying the file at the same time.
  68. lock_rules_file
  69.  
  70. # Check if the rules file is writeable.
  71. choose_rules_file
  72.  
  73. # the DRIVERS key is needed to not match bridges and VLAN sub-interfaces
  74. if [ "$MATCHADDR" ]; then
  75.     match="$match, DRIVERS==\"?*\", ATTR{address}==\"$MATCHADDR\""
  76. fi
  77.  
  78. if [ "$MATCHDRV" ]; then
  79.     match="$match, DRIVERS==\"$MATCHDRV\""
  80. fi
  81.  
  82. if [ "$MATCHDEVID" ]; then
  83.     match="$match, ATTR{dev_id}==\"$MATCHDEVID\""
  84. fi
  85.  
  86. if [ "$MATCHID" ]; then
  87.     match="$match, KERNELS==\"$MATCHID\""
  88. fi
  89.  
  90. if [ "$MATCHIFTYPE" ]; then
  91.     match="$match, ATTR{type}==\"$MATCHIFTYPE\""
  92. fi
  93.  
  94. if [ -z "$match" ]; then
  95.     echo "missing valid match" >&2
  96.     unlock_rules_file
  97.     exit 1
  98. fi
  99.  
  100. basename=${INTERFACE%%[0-9]*}
  101. match="$match, KERNEL==\"$basename*\""
  102.  
  103. if [ "$INTERFACE_NAME" ]; then
  104.     # external tools may request a custom name
  105.     COMMENT="$COMMENT (custom name provided by external tool)"
  106.     if [ "$INTERFACE_NAME" != "$INTERFACE" ]; then
  107.         INTERFACE=$INTERFACE_NAME;
  108.         echo "INTERFACE_NEW=$INTERFACE"
  109.     fi
  110. else
  111.     # if a rule using the current name already exists, find a new name
  112.     if interface_name_taken; then
  113.         INTERFACE="$basename$(find_next_available "$basename[0-9]*")"
  114.         echo "INTERFACE_NEW=$INTERFACE"
  115.     fi
  116. fi
  117.  
  118. write_rule "$match" "$INTERFACE" "$COMMENT"
  119.  
  120. unlock_rules_file
  121.  
  122. exit 0
  123.